home *** CD-ROM | disk | FTP | other *** search
- *****************************************************************
- * *
- * BeatMaster V0.1 -- BPM Zähler *
- * *
- *****************************************************************
- *
- * Von Richard Körber am 8. 9.1994
- *
- *****************************************************************
-
- INCDIR "Include:"
- INCLUDE exec.i
- INCLUDE intuition.i
-
- SECTION text,CODE
-
- *---------------------------------------------------------------*
- * EQUates definieren *
- * *
- ;-- Farben -----------------------------;
- GREY EQU 0 ;Standard-2.0-Farben
- BLACK EQU 1
- WHITE EQU 2
- BLUE EQU 3
- ;-- Tag-Nummern ------------------------;
- TAG_USER EQU $80000000
- TAG_DONE EQU $00000000
- ;-- New-Window-Equates -----------------;
- nw_Screen EQU 30
- wd_UserPort EQU $56
- CLOSEWINDOW EQU $0200
- RAWKEY EQU $0400
- WINDOWSIZING EQU 1
- WINDOWDRAG EQU 2
- WINDOWDEPTH EQU 4
- WINDOWCLOSE EQU 8
- SIZEBBOTTOM EQU $20
- ACTIVATE EQU $1000
- WBENCHSCREEN EQU $1
-
- *---------------------------------------------------------------*
- * == Start von WB == *
- * *
- start sub.l a1,a1
- exec FindTask ;Task suchen
- move.l d0,a4 ;Task in A4
- tst.l 172(a4) ;pr_CLI prüfen
- bne.b .nomessage
- lea 92(a4),a0 ;^Port
- move.l a0,-(sp)
- exec WaitPort ;Auf Message warten
- move.l (sp)+,a0
- exec GetMsg ; und abholen
- move.l d0,wbmessage
- .nomessage bsr s
- move.l wbmessage(PC),d7 ;Gab es eine?
- beq.b .nowbm
- exec Forbid
- move.l d7,a1 ;Beantworten
- exec ReplyMsg
- ;-- Alles klar -------------------------;
- .nowbm moveq #0,d0 ;Kein Error
- rts
-
- *---------------------------------------------------------------*
- * Los geht das Programm *
- * *
- s ;-- Lib öffnen -------------------------;
- lea intuiname(PC),a1 ;Intuition öffnen
- moveq #33,d0 ;ab Kick 1.2 erlaubt!!!
- exec OpenLibrary
- move.l d0,intuibase
- ;-- Window öffnen ----------------------;
- lea newwindow(PC),a0
- intui OpenWindow
- move.l d0,window
- move.l window(PC),a0 ;Nachricht
- lea itxtmsg(PC),a1
- moveq #0,d0 ;Offset X
- moveq #0,d1 ;Offset Y
- move.b $36(a0),d0
- move.b $37(a0),d1
- move.l $32(a0),a0 ;^RastPort
- intui PrintIText
- ;-- Warte auf Message ------------------;
- .nxtmsg move.l window,a0
- move.l wd_UserPort(a0),a0 ;Port holen
- move.l a0,-(sp)
- exec WaitPort ;Warten
- move.l (sp)+,a0
- exec GetMsg ;Nachricht lesen
- move.l d0,a1 ; kann nur Close sein
- move.l $14(a1),d7 ;IDCMP merken
- move.l $24(a1),d6 ; Seconds,
- move.l $28(a1),d5 ; Micros natürlich auch
- move $18(a1),d4 ;Key
- swap d4
- move $1a(a1),d4 ;Qualifier
- exec ReplyMsg ;Message beantworten
- ;-- Message dekodieren -----------------;
- cmp.l #CLOSEWINDOW,d7
- beq.b exit
- btst #23,d4 ;Keycode für KeyUp?
- bne.b .nxtmsg ; dann nächstes Event
- cmp #$0200,d4 ;Repeat?
- beq.b .nxtmsg ; dann nächstes Event
- move.l seconds(PC),d0 ;Delta berechnen
- move.l micros(PC),d1
- move.l d6,seconds
- move.l d5,micros
- sub.l d0,d6
- sub.l d1,d5
- bcc.b .isok
- subq.l #1,d6 ;Sek -1
- add.l #1000000,d5 ;µ + 1M
- .isok divu #1000,d5 ;D5 kürzen auf 1000stel
- swap d5 ;Rest interessiert nicht
- clr d5
- swap d5
- mulu #1000,d6 ;Sek *100
- add.l d5,d6 ;D6: 1000tel Sekunden
- beq.b .flash
- move.l #1000*60,d0
- divu d6,d0 ;(100/100tel) * 60 = BPM
- lea buffer(PC),a0 ;Wandeln
- bsr bin2asc
- move.l window(PC),a0
- lea itxtbuff(PC),a1
- moveq #0,d0 ;Offset X
- moveq #0,d1 ;Offset Y
- move.b $36(a0),d0
- move.b $37(a0),d1
- move.l $32(a0),a0 ;^RastPort
- intui PrintIText
- .flash move #$0800,$dff180 ;Screen kurz flashen
- bra.w .nxtmsg
- ;-- Window schließen -------------------;
- exit move.l window(PC),a0
- intui CloseWindow
- ;-- Lib schließen ----------------------;
- move.l intuibase(PC),a1
- exec CloseLibrary
- ;-- Fertig -----------------------------;
- moveq #0,d0 ;Alles OK
- rts
-
- *-------------------------------------------------------*
- * bin2asc Wandelt Binär -> Ascii *
- * -» A0.l ^Buffer (6 Bytes) *
- * -» D0.w Zahl *
- * *
- bin2asc move.l #" ",(a0)+
- move #" ",(a0)+
- and.l #$ffff,d0 ;bereich einschränken
- .loop divu #10,d0
- swap d0
- add.b #"0",d0
- move.b d0,-(a0)
- clr d0
- swap d0
- bne.b .loop
- rts
-
- *-------------------------------------------------------*
- * Datenstrukturen, Variablen, Texte *
- * *
- wbmessage dc.l 0 ;^WB-Msg oder 0
- intuibase dc.l 0 ;^Intuibase
- window dc.l 0 ;^Window
- seconds dc.l 0 ;letzte Seconds
- micros dc.l 0 ;letzte Micros
- buffer ds.b 6 ;EVEN
- dc.b " BPM (Beats Per Minute)",0
- even
- ;-- Intui Text -------------------------;
- itxtbuff dc.b BLACK,GREY,1,0
- dc.w 10,3
- dc.l 0,buffer,0
- itxtmsg dc.b BLUE,GREY,1,0
- dc.w 25,14
- dc.l 0,.txt,0
- .txt dc.b "hit any key at every beat...",0
- even
- ;-- NewWindow-Struktur -----------------;
- newwindow dc.w 50 ; nw_LeftEdge
- dc.w 25 ; nw_TopEdge
- dc.w 300 ; nw_Width
- dc.w 40 ; nw_Height
- dc.b GREY ; nw_DetailPen
- dc.b BLACK ; nw_BlockPen
- dc.l CLOSEWINDOW!RAWKEY ; nw_IDCMPFlags
- dc.l WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE!ACTIVATE
- dc.l 0 ; nw_FirstGadget
- dc.l 0 ; nw_CheckMark
- dc.l wndtitle ; nw_Title
- dc.l 0 ; nw_Screen (nachgetragen)
- dc.l 0 ; nw_BitMap
- dc.w 0,0 ; nw_MinWidth Height
- dc.w 0,0 ; nw_MaxWidth Height
- dc.w WBENCHSCREEN ; nw_Type
- ;-- Texte ------------------------------;
- wndtitle dc.b 'BeatMaster V0.1 by R.Körber',0
- intuiname dc.b 'intuition.library',0
-
- *---------------------------------------------------------------*
- * Fertig *
- * *
- END
-